package com.xuzy.x808.common.utils;

public class ByteUtils {
    /**
     * 读入数据时通过按位与操作将bcd编码转换成设备编号devId
     *
     * @param bcd
     * @return
     */
    public static String bcdToString(byte[] bcd) {
        // 存储转码后的字符串
        StringBuilder sb = new StringBuilder();

        // 循环数组解码 先将每个位上的
        for (int i = 0; i < bcd.length; i++) {
            // 转换低字节 十六进制的  0x0f 等于十进制的 15，二进制表示为00001111，直接取到低4位
            int low = (bcd[i] & 0x0f);
            // 转换高字节 十六进制的  0xf0 等于十进制的 240，二进制表示为11110000，右移4位的意思是取高4位
            int high = ((bcd[i] & 0xf0) >> 4);

            // 如果高字节等于0xf（二进制1111）说明是补的字节，直接抛掉
            if (high != 0xf) {
                sb.append(high);
            }

            sb.append(low);
        }
        // 返回解码字符串
        return sb.toString();
    }

    /**
     * 写出数据时将我们业务中的devId转换成bcd编码
     *
     * @param bcd
     * @return
     */
    public static byte[] strToBcd(String bcd) {
        // 获取字节数组长度
        int size = bcd.length() / 2;
        int remainder = bcd.length() % 2;

        // 存储BCD码字节
        byte[] bcdByte = new byte[size + remainder];

        // 转BCD码
        for (int i = 0; i < size; i++) {
            int high = Integer.parseInt(bcd.substring(2 * i, 2 * i + 1));
            int low = Integer.parseInt(bcd.substring(2 * i + 1, 2 * i + 2));
            bcdByte[i] = (byte) ((high << 4) | low);
        }

        // 如果存在余数，需要填F
        if (remainder > 0) {
            int low = Integer.parseInt(bcd.substring(bcd.length() - 1));
            bcdByte[bcdByte.length - 1] = (byte) ((0xf << 4) | low);
        }

        // 返回BCD码字节数组
        return bcdByte;

    }
}
